/*
1、获取用户的收货地址
  1绑定点击事件
  2调用小程序内置api获取用户的收货地址 wx.chooseAddress
2、页面加载完毕onLoad  onShow
  1获取本地存储中的地址数据
  2把数据设置给data中的一个变量
3、inShow
  0回到商品详情页面，第一次添加商品的时候手动添加属性num=1;checked=true;
  1获取缓存中的购物车数组
  2把购物车数据 填充到data中
4、全选实现 数据的展示
  1onShow获取缓存中的购物车数组
  2根据购物车中的商品数据  所有商品都被选中checked=true全选就选中
5、总价格和总数量
  1都需要商品被选中，才计算
  2获取购物车数组，遍历
  3判断商品是否被选中，选中：总价格+=商品单价*商品数量，总数量+=商品的数量
  4把计算后的价格和数量 设置回data中即可
6、商品的选择功能
  1绑定change事件
  2获取被修改的商品对象
  3商品对象的选择状态 取反
  4重新填充回data中和缓存中
  5重新计算全选 总价格 总数量
7、全选反选功能
  1全选复选框绑定事件change
  2获取data中的全选变量allChecked
  3直接取反allChecked=！allChecked
  4遍历购物车数组  让里面商品选中状态跟随 allChecked改变而改变
  5把购物车数组和allChecked重新设置回data，把购物车重新设置回缓存中
8、商品数量的编辑功能呢
  1+-按钮绑定同一个点击事件，区分关键自定义属性
  2传递被点击的商品goods_id
  3获取到data中的购物车数组  来获取需要被修改的商品对象
   当购物车数量为1，点击-弹窗提示是否要删除
  4直接修改商品对象的数量属性num
  5把cart数组重新设置回缓存中和data中  ，this.setCart
9、点击结算
  1判断是否有收货地址 ，是否选购物品
  2都有跳转到支付页面
*/
import {getSetting,chooseAddress,openSetting,showModal,showToast} from "../../utils/asyncWx.js";
import regeneratorRuntime from '../../lib/runtime/runtime.js';
Page({
  data:{
    address:{},
    cart:[],
    allChecked:false,
    totalPrice:0,
    totalNum:0
  },
  onShow(){
    // 1获取缓存中的收货地址信息
    const address=wx.getStorageSync('address');
    // 1、获取缓存中的购物车数据
    const cart=wx.getStorageSync('cart') || [];
    this.setData({address});
    this.setCart(cart);
  },
   // 点击 收货地址
   async handleChooseAddress() {
    try {
      // 1 获取 权限状态
      const res1 = await getSetting();
      const scopeAddress = res1.authSetting["scope.address"];
      // 2 判断 权限状态
      if (scopeAddress === false) {
        await openSetting();
      }
      // 4 调用获取收货地址的 api
      let address = await chooseAddress();
      address.all = address.provinceName + address.cityName + address.countyName + address.detailInfo;

      // 5 存入到缓存中
      wx.setStorageSync("address", address);

    } catch (error) {
      console.log(error);
    }
  },
  //商品的选中
  handleItemChange(e){
    //1获取被修改的商品id
    const goods_id=e.currentTarget.dataset.id;
    //2获取购物车数组
    let {cart}=this.data;
    //3找到被修改的商品对象
    let index=cart.findIndex(v=>v.goods_id===goods_id);
    //4选中状态取反
    cart[index].checked=!cart[index].checked;
    this.setCart(cart);
  },
  //设置购物车状态同时重新计算底部工具栏的数据 
  setCart(cart){
    let allChecked=true;
    //总价格 总数量
    let totalPrice=0;
    let totalNum=0;
    cart.forEach(v=>{
      if(v.checked){
        totalPrice+=v.num*v.goods_price;
        totalNum+=v.num;
      }else {
        allChecked=false;
      }
    })
    //判断数组是否为空
    allChecked=cart.length!=0?allChecked:false;
    //2给data赋值
    this.setData({
      cart,
      allChecked,
      totalPrice,
      totalNum
    });
    wx.setStorageSync('cart', cart);
  },
  //全选
  handleItemAllChecked(){
    // 1获取data中的数据
    let {cart,allChecked}=this.data;
    // 2修改值
    allChecked=!allChecked;
    // 3循环修改cart数组中的商品选中状态
    cart.forEach(v=>v.checked=allChecked);
    // 4修改后的值填充回data中或者缓存中
    this.setCart(cart);
  },
  //商品数量编辑功能
  async handleItemNumEdit(e){
    
    //1获取传递来的参数
    const {operation,id}=e.currentTarget.dataset;
    //2获取购物车数组
    let {cart}=this.data;
    //3找到需要修改的商品的索引
    const index=cart.findIndex(v=>v.goods_id===id);
    //判断是否要执行删除
    if(cart[index].num===1&&operation===-1){
      //弹窗
      const res=await showModal({content:"您是否要删除？"});
      if (res.confirm) {
        cart.splice(index,1);
        this.setCart(cart);
      } 
    }else{
    //4进行修改数量
    cart[index].num+=operation;
    //5设置回缓存和data中
    this.setCart(cart);
  }
  },
  //点击结算
  async handlePay(e){
    const {address,totalNum}=this.data;
    // 判断有无地址
    if(!address.userName){
      await showToast({title:'您还没有选择收获地址'});
      return;
    }
    //判断有无商品
    if(totalNum===0){
      await showToast({title:"您还没有选择商品"});
      return;
    }
    //跳转支付页面
    wx.navigateTo({
      url: '/pages/pay/index'
    })
  }
})